package oop.controller.action.markconst;

import java.sql.SQLException;
import java.util.List;

import oop.controller.action.DefaultAction;
import oop.data.SectionStructure;
import oop.data.TestStructure;
import oop.db.dao.MarkConstraintDAO;
import oop.db.dao.SectionStructureDAO;
import oop.db.dao.TestStructureDAO;

import org.apache.commons.lang.StringUtils;

import com.oreilly.servlet.ParameterNotFoundException;

public class CreateAction extends DefaultAction {

	public CreateAction() {
	}

	@Override
	public void performImpl() throws Exception {
		long testStructureId = Long.parseLong(request.getParameter("teststruct"));
		TestStructure testStructure = TestStructureDAO.fetchById(testStructureId).get(0);
		request.setAttribute("test", testStructure);

		String submit = request.getParameter("submit");
		if ("add".equals(submit)) {
			doCreate(testStructureId);
		}
	}

	private void doCreate(long testStructureId) throws SQLException {
		String sectionIdStr = request.getParameter("section");
		SectionStructure sectionStructure;
		if (StringUtils.isEmpty(sectionIdStr)) {
			List<SectionStructure> sectionStructures = SectionStructureDAO
					.fetchByTestStructure(testStructureId);
			if (sectionStructures.isEmpty()) {
				sectionStructure = SectionStructureDAO.create(null,
						testStructureId, 1);
			} else {
				if (sectionStructures.size() == 1) {
					sectionStructure = sectionStructures.get(0);
				} else {
					sectionError = "Bạn cần chọn một mục.";
					return;
				}
			}
		} else {
			try {
				long sectionId = Long.parseLong(sectionIdStr);
				sectionStructure = SectionStructureDAO.fetchById(sectionId)
						.get(0);
			} catch (NumberFormatException ex) {
				sectionError = "Mã số mục không hợp lệ.";
				return;
			}
		}

		int quantity;
		try {
			quantity = getParams().getInt("quantity");
			if (quantity <= 0) {
				quantityError = "Số lượng phải nguyên dương.";
				return;
			}
		} catch (ParameterNotFoundException ex) {
			quantityError = "Bạn cần nhập số lượng.";
			return;
		} catch (NumberFormatException ex) {
			quantityError = "Số lượng không hợp lệ.";
			return;
		}

		int mark;
		try {
			mark = getParams().getInt("mark");
			if (mark <= 0) {
				markError = "Điểm phải là số nguyên dương.";
				return;
			}
		} catch (ParameterNotFoundException ex) {
			markError = "Bạn cần chọn độ khó.";
			return;
		} catch (NumberFormatException ex) {
			markError = "Độ khó không hợp lệ.";
			return;
		}

		try {
			MarkConstraintDAO.create(sectionStructure.getId(), mark, quantity);
			setNextAction("teststruct.view&tsv_id=" + testStructureId);
		} catch (SQLException ex) {
			if (ex.getErrorCode() == 1062) {
				markError = "Mức điểm đã được thêm từ trước.";
			} else {
				throw ex;
			}
		}
		
	}

	private String sectionError = null;
	private String markError = null;
	private String quantityError = null;

	public String getSectionError() {
		return sectionError;
	}
	
	public String getMarkError() {
		return markError;
	}
	
	public String getQuantityError() {
		return quantityError;
	}
	
}
